﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC.DTO;
using System.Data;
using TCC.Common;

namespace TCC.DB.DA
{
    public class DaFilme : DbBase
    {
        private List<DtoFilme> Mapear(DataTable tb)
        {
            var res = new List<DtoFilme>();

            foreach (DataRow row in tb.Rows)
            {
                res.Add(new DtoFilme
                    {
                        Id = Utils.Conversores.ConverteTextoParaInteiro(row[0].ToString()),
                        Nome = row[1].ToString(),
                        Diretor = row[2].ToString(),
                        Sinopse = row[3].ToString(),
                        Genero = new DtoGenero
                            {
                                Id = Utils.Conversores.ConverteTextoParaInteiro(row[4].ToString()),
                                Nome = row[5].ToString()
                            },
                        Ano = Utils.Conversores.ConverteTextoParaInteiro(row[6].ToString()),
                        Hits = Utils.Conversores.ConverteTextoParaInteiro(row[7].ToString())
                    });
            }

            return res;
        }

        public List<DtoFilme> ListarTodos()
        {
            var qry = "select tf.idFilme, tf.nomeFilme, tf.diretor, tf.sinopse, tg.idGenero, tg.nmGenero, tf.ano, tf.hits " +
                      "from tbFilmes tf inner join tbGeneros tg on tf.generofilme = tg.idgenero";

            var tb = Fill(qry);

            return Mapear(tb);
        }

        public List<DtoFilme> ListarTodosPorPreferenciaUsuario(int idUsuario)
        {
            var qry = "select tf.idFilme, tf.nomeFilme, tf.diretor, tf.sinopse, tg.idGenero, tg.nmGenero, tf.ano, tf.hits " +
                "from tbFilmes tf " +
                "	inner join tbGeneros tg  " +
                "	on tf.generofilme = tg.idgenero " +
                "	inner join tbpreferencia tp " +
                "	on tp.idUser = " + idUsuario + " " +
                "		and tp.idGenero = tg.idGenero " +
                "Where tp.numNota > 2";

            var tb = Fill(qry);

            return Mapear(tb);
        }

        public DtoFilme ListarUm(int idFilme)
        {
            var qry = "select tf.idFilme, tf.nomeFilme, tf.diretor, tf.sinopse, tg.idGenero, tg.nmGenero, tf.ano, tf.hits " +
                "from tbFilmes tf inner join tbGeneros tg on tf.generofilme = tg.idgenero " +
                "where tf.idFilme = " + idFilme;

            var tb = Fill(qry);

            return Mapear(tb).FirstOrDefault();
        }

        ///*Esse método aqui, é onde ele busca na tabela, o # de hits do ítem selecionado, 
        // *joga para dentro de uma variavel, soma 1 e depois faz o update na tabela.*/
        public void AddHit(int idFilme)
        {
            var qry = "Update tbFilmes " +
                      "set hits = hits + 1 " +
                      "where idfilme = " + idFilme;

            ExecuteNonQuery(qry);
        }

        public void AddHit(DtoFilme filme)
        {
            AddHit(filme.Id);
        }

        public List<DtoFilme> GerarListaDistribuida(List<DtoFilme> lFilmes)
        {
            var lFDist = new List<DtoFilme>();

            lFilmes = lFilmes.OrderBy(f => f.Hits).Reverse().ToList();

            var qtdItens = lFilmes.Count;
            var VintePorcento = Convert.ToInt32(qtdItens * 0.2);

            var lVP = lFilmes.GetRange(0, VintePorcento);
            var lOVP = lFilmes.GetRange(VintePorcento, lFilmes.Count - VintePorcento);
            lOVP.Reverse();

            var cont = 1;
            var contVP = 0;

            lOVP.ForEach(f =>
            {
                lFDist.Add(f);

                if (cont == 4)
                {
                    lFDist.Add(lVP[contVP]);
                    cont = 1;
                    contVP++;
                }
                else
                    cont++;
            }
            );

            if (qtdItens * 0.2 - Math.Truncate(qtdItens * 0.2) > 0.5)
                lFDist.Add(lVP[contVP]);

            return lFDist;
        }
    }
}